import pulp

#关于使用python解决整数规划，要用到一个新的库叫做pulp,所以关于这个库的使用也需要现学。
#查阅了一些资料，我把学到的操作方法列成教程如下：

#使用pulp库解决整数规划问题大体上可以划分为如下几个步骤：
#1：定义模型
#2：定义决策变量
#3：添加约束条件
#4：添加目标函数
#5：模型求解
#6：打印结果

#第一步：定义模型
model = pulp.LpProblem(name="My-Model", sense=pulp.LpMaximize)
#这个操作是使用 pl.LpProblem 创建了一个模型并赋值给变量 model，接收两个参数：
#name：模型的名字，随便起一个；
#sense：模型的类型，pl.LpMinimize是求目标函数的最小值，pl.LpMaximize 是求最大值

# 第二步：定义决策变量。
# 一般情况下遇到的线性规划问题中，自变量都比较多
# 用下面的方法可以方便快速定义较多决策变量：
x = {i: pulp.LpVariable(name=f"x{i}", lowBound=0, cat=pulp.LpInteger) for i in range(1, 9)}
#用一个for循环写成range(1,9)实际上就包含了我们的x1到x8的这8个决策变量。
#   这是一次定义 8 个变量并保存在一个类似数组的结构中，变量都是正整数，
# 分别用 x[1], x[2], ..., x[8] 表示，依次命名为 x1, x2,..., x8。

#  注意：name就是变量名
#  lowBound：变量的最小取值（不写的话默认负无穷）；
#    upBound：变量的最大取值（默认正无穷）；
#   cat：变量的类型，有 pl.Binary 逻辑变量、pl.Integer 整数、pl.Continuous 实数（默认值）；

#   第三步：添加约束条件
model += (x[1]+x[2]-x[3]-x[4]-x[5] == 0,'eq1')
model += (5*x[1]+10*x[6] <= 6000,'ineq1')
model += (7*x[2]+9*x[7]+12*x[8] <= 10000,'ineq2')
model += (6*x[3]+8*x[6]+8*x[7] <= 4000,'ineq3')
model += (4*x[4]+11*x[8] <= 7000,'ineq4')
model += (7*x[5] <= 4000,'ineq5')
# 括号里第一个变量就是你的约束不等式或等式，
# 第二个变量是你的自定义的约束名（可以起一个有意义的名字，当然也可以省略）
#   但是一定不要为中文！否则会报错！

#   第四部：添加目标函数
#   注意，这里目标函数不需要加括号
model += 0.75*x[1]+0.7753*x[2]-0.375*x[3]-783/1750*x[4]-0.35*x[5]+0.65*x[6]+0.8611*x[7]+(2.3-12*321/10000-783*11/7000)*x[8]

#   第五步：模型求解——很简单，就一句话
status = model.solve()
#   就写这一句话，调用 model 的 solve() 方法，并把结果保存在 status 中。

#   第六步：打印结果
print(f"status: {model.status}, {pulp.LpStatus[model.status]}")
print(f"objective: {model.objective.value()}")
for var in model.variables():
    print(f"{var.name}: {var.value()}")
for name, constraint in model.constraints.items():
    print(f"{name}: {constraint.value()}")
